"""
定时器模块。
"""
from .core import dispatch, get_event_loop

_loop = get_event_loop()


def scheduled(seconds: float):
    """
    定时运行某个函数。
    使用装饰器语法糖，使用方法：
    @scheduled(1)
    async def test():
        print(time.time())
    :param seconds: 每次运行函数时间隔多少秒。
    :returns: 一个表示当前任务的定时器对象。
    """

    class Scheduler:
        """
        对一个正在运行的任务进行管理。
        """
        __slots__ = ('_current', '_func')

        def __init__(self, func):
            self._func = func
            self._current = None
            self.resume()

        def cancel(self):
            """
            取消当前的定时器。
            """
            if self._current:
                self._current.cancel()
                self._current = None
                self._func = None

        def pause(self):
            """
            暂停当前的定时器。
            """
            if self._current:
                self._current.cancel()
                self._current = None

        def resume(self):
            """
            继续运行当前的定时器。
            """
            if not self._func:
                raise RuntimeError('The canceled timer cannot continue running.')
            self._current = None
            if self._current:
                return
            dispatch(self._func())
            self._current = _loop.call_later(seconds, self.resume)

    def inner(func) -> Scheduler:
        """
        内部使用。
        """
        return Scheduler(func)

    return inner
